<?php



namespace app\userapi\validate;

use Wangpeng1208\Captcha\Captcha;

class UserValidate extends Base
{
    protected $rule = [
        'username'    => 'checkUsername',
        'email'       => 'email|unique:user',
        'password'    => 'require|min:6|max:16',
        'email_code'  => 'require',
        'captcha'     => 'require|captcha',
        'captcha_key' => 'require',
    ];
    protected $message = [
        'username.require'       => '账号未填写!',
        'username.checkUsername' => '账号格式错误!',
        'email.email'            => '邮箱格式错误!',
        'email.unique'           => '邮箱已被注册!',
        'password.require'       => '密码未填写',
        'password.min'           => '密码位数必须在6~16位之间',
        'password.max'           => '密码位数必须在6~16位之间',
        'email_code.require'     => '邮箱验证码未填写',
        'captcha.require'        => '验证码未填写',
        'captcha_key.require'    => '验证码标识错误',
        'captcha.captcha'        => '验证码错误',
    ];

    public function captcha($value, $rule, $data)
    {
        $captcha = new Captcha();
        if (!$captcha->check($value, $data['captcha_key'])) {
            return false;
        }
        return true;
    }

    /**
     * 检查username字段，如果是邮箱格式则自动设置email字段并验证唯一性
     * 如果不是邮箱格式，则验证username必须包含字母且不能为纯数字
     */
    public function checkUsername($value, $rule, $data)
    {
        // 如果username为空（邮箱格式已转换），跳过验证
        if (empty($value)) {
            return true;
        }

        // 如果是邮箱格式（这种情况不应该出现，因为已在data方法中转换）
        if (filter_var($value, FILTER_VALIDATE_EMAIL)) {
            // 检查邮箱是否已被注册
            $model = new \app\common\model\User();
            if ($model->where('email', $value)->find()) {
                return '邮箱已被注册!';
            }
            return true;
        }

        // 检查是否是手机号格式（简单验证11位数字）
        // if (preg_match('/^1[3-9]\d{9}$/', $value)) {
        //     return '请使用用户名格式，不支持手机号注册!';
        // }

        // 验证username格式：必须包含字母且不能为纯数字
        if (is_numeric($value)) {
            return '用户名不能为纯数字!';
        }

        if (!preg_match('/[a-zA-Z]/', $value)) {
            return '用户名必须包含字母!';
        }

        // 验证username的唯一性
        $model = new \app\common\model\User();
        if ($model->where('username', $value)->find()) {
            return '用户名已被注册!';
        }

        return true;
    }

    public function sceneRegister()
    {
        return $this->only(['username', 'email', 'password', 'captcha', 'captcha_key']);
    }


    public function sceneLoginByPassword()
    {
        // 移除username的所有验证，因为登录时username可以是邮箱
        $this->remove('username', 'checkUsername');
        return $this->only(['username', 'password', 'captcha', 'captcha_key']);
    }

    public function sceneLoginByEmailCode()
    {
        // 移除username的所有验证，因为登录时username可以是邮箱
        $this->remove('username', 'checkUsername');
        return $this->only(['username', 'email_code']);
    }


    public function sceneEmailCode()
    {
        // 移除email的unique验证，因为登录时需要邮箱已存在
        $this->remove('email', 'unique');
        return $this->only(['email', 'captcha', 'captcha_key']);
    }

    public function sceneCaptcha()
    {
        return $this->only(['captcha', 'captcha_key']);
    }

    /**
     * 重写data方法，处理注册场景下username到email的自动转换
     */
    public function data($scene = null, array $validateData = [])
    {
        $params = request()->post();
        $params = array_merge($params, $validateData);

        // 如果是注册场景且username是邮箱格式，自动转换
        if ($scene === 'register' && isset($params['username']) && filter_var($params['username'], FILTER_VALIDATE_EMAIL)) {
            $params['email']    = $params['username'];
            $params['username'] = ''; // 清空username
        }

        //场景
        if ($scene == null) {
            throw new \think\Exception('场景不能为空');
        }

        $this->scene($scene)->failException(true)->check($params);
        return $params;
    }
}
